const http = require('http');
const fs = require('fs');
const path = require('path');

// 获取命令行参数
const args = process.argv.slice(2);
const fileName = args[0];

// 创建HTTP服务器
const server = http.createServer((req, res) => {
  console.log(`收到请求: ${req.method} ${req.url}`);
  
  // 设置响应头
  res.writeHead(200, {
    'Content-Type': 'text/plain; charset=utf-8',
    'Access-Control-Allow-Origin': '*'
  });
  
  // 确定要读取的文件
  let targetFile;
  if (fileName) {
    // 如果传入了命令行参数，检查文件是否存在
    targetFile = fileName;
    if (!fs.existsSync(targetFile)) {
      const errorMsg = `错误：文件 ${targetFile} 不存在！`;
      console.error(errorMsg);
      res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });
      res.end(errorMsg);
      return;
    }
  } else {
    // 如果没有传入参数，默认读取当前文件
    targetFile = __filename; // fileReader3.js
  }
  
  console.log(`正在读取文件: ${targetFile}`);
  
  // 使用 fs.createReadStream 创建可读流
  const readableStream = fs.createReadStream(targetFile, { encoding: 'utf8' });
  
  // 将流数据通过管道传输到响应对象
  readableStream.pipe(res);
  
  // 监听流事件
  readableStream.on('error', (err) => {
    console.error('读取文件时出错:', err);
    res.writeHead(500, { 'Content-Type': 'text/plain; charset=utf-8' });
    res.end('读取文件时出错: ' + err.message);
  });
  
  readableStream.on('end', () => {
    console.log('文件流读取完成');
  });
  
  readableStream.on('open', () => {
    console.log('文件流开始读取');
  });
});

// 监听8081端口
const PORT = 8081;
server.listen(PORT, () => {
  console.log(`服务器运行在 http://localhost:${PORT}`);
  if (fileName) {
    console.log(`将读取文件: ${fileName}`);
  } else {
    console.log('将读取当前文件: fileReader3.js');
  }
  console.log('请在浏览器中访问该地址查看文件内容');
  console.log('\n思考：使用流的读取方式(fs.createReadStream)和直接进行文件读取的区别：');
  console.log('1. 内存使用：流式读取占用内存更少，适合大文件');
  console.log('2. 性能：流式读取可以边读边处理，响应更快');
  console.log('3. 可扩展性：流式读取可以处理任意大小的文件');
  console.log('4. 错误处理：流式读取有更好的错误处理机制');
});

// 处理服务器错误
server.on('error', (err) => {
  console.error('服务器错误:', err);
});
